// Storage封装
// 案例:list2 : {"user":{"age":17,"name":"刘凯欣","hahaw":"1234"}} ;
export default {

    // 存储值 (前2个参数必须填写);
    // 第一个参数 是 设置 sessionStorage 的 key ;第二个参数是 设置value;
    // 第三个参数  如果传的话 就是修改 某一个sessionStorage的属性值并且注入新的属性和值;
    // 第四个参数 具体选择的是哪个一个 属性值;
    setItem(key, value, father_key, son_key) {
        if (father_key) {
            // 这里获取的是 sessionStorage 里面的 key 里面的第一级属性名
            let val = this.getItem(father_key);
            // console.log(val);
            // 这里创建的的是 sessionStorage 里面的 key 里面第一级对象里的 属性名称和值;
            // 相当于重写了 第一级 对象下面的属性名和值; 
            val[son_key][key] = value;
            // console.log(val);
            // 这时候的val 就发生变化了;多了新添加的名称和值;

            // 这里进行 递归操作;  把之前的重写过后的数据在存值;
            this.setItem(father_key, val);
        }
        else {
            let val = this.getStorage();
            val[key] = value;
            window.sessionStorage.setItem(key, JSON.stringify(value));
        }
    },

    // 获取值  
    // 第一个参数作为 sessionStorage 里面的 key ,第二个为 json 数据格式中的某个属性
    getItem(father_key, key) {
        if (key) {
            return this.getStorage(father_key)[key];
        }
        else {
            return this.getStorage(father_key);
        }

    },

    // 获取整个数据 
    // 第一个参数作为 sessionStorage 里面的 key
    getStorage(father_key) {
        return JSON.parse(window.sessionStorage.getItem(father_key) || "{}");
    },

    // 清空 某一个值
    // 3个参数 对应3种情况 传一个 传2个 传3个;
    clear(father_key, son_key, key) {
        // 第一种情况 删除 某一个 sessionStorage 里面的key        
        let val = this.getStorage(father_key);
        if (father_key&&!son_key&&!key) {
            sessionStorage.removeItem(father_key)
        }
        // 第二种情况 删除 某一个 sessionStorage key对应的value值 第一级中的 属性名称和值; 
        if(father_key && son_key &&!key){
            // 删除 填写的属性:
            delete val[son_key]
            // 删除后 val 值发生了变化;在重新setItem 赋值；
            this.setItem(father_key,val)
        }
        // 第三种情况 删除 某一个 sessionStorage key对应的value值 第二级中的 属性名称和值; 
        if(father_key && son_key && key){
            // 删除 填写的属性:
            delete val[son_key][key]
            // 删除后 val 值发生了变化;在重新setItem 赋值；
            this.setItem(father_key,val)
        }
    }
}